package LeetCode.BitCompute;


/**
 * 位运算10 数字的补数
 * https://leetcode-cn.com/problems/number-complement/
 * 476. 数字的补数
 * 给定一个正整数，输出它的补数。补数是对该数的二进制表示取反。
 * 示例 1:
 * 输入: 5
 * 输出: 2
 * 解释: 5 的二进制表示为 101（没有前导零位），其补数为 010。所以你需要输出 2 。
 * 示例 2:
 * 输入: 1
 * 输出: 0
 * 解释: 1 的二进制表示为 1（没有前导零位），其补数为 0。所以你需要输出 0 。
 * <p>
 * 注意:
 * 给定的整数保证在 32 位带符号整数的范围内。
 * 你可以假定二进制数不包含前导零位。
 * 本题与 1009 https://leetcode-cn.com/problems/complement-of-base-10-integer/ 相同
 */
public class Test10 {
    //static int Integer.bitCount();           // 统计 1 的数量
    //static int Integer.highestOneBit();      // 获得最高位
    //static String toBinaryString(int i);     // 转换为二进制表示的字符串

    //二进制与十进制互相转换：
    //十转二
    //toBinaryString(int num)
    //toUnsignedString(num, 2)
    //二转十
    //parseInt(String/char[],2)
    //例如 Integer.parseInt(String.valueOf(chars),2);//二进制转十进制 char[]

    public static int findComplement(int num) {
        System.out.println("1.转二进制" + Integer.toBinaryString(num));
//        System.out.println("转二进制"+Integer.toUnsignedString(num, 2));
        char[] chars = Integer.toBinaryString(num).toCharArray();//十进制转二进制
        System.out.println("2.chars 长度" + chars.length);
        for (int i = chars.length - 1; i >= 0; i--) {
            if (chars[i] == '1') {
                chars[i] = '0';
            } else {
                chars[i] = '1';
            }
        }
        System.out.println("3.二进制结果" + String.valueOf(chars));
        return Integer.parseInt(String.valueOf(chars), 2);//二进制转十进制
    }

    public static int findComplement2(int num) {
        String str = Integer.toBinaryString(num);
        return Integer.parseInt(str.replace('1', '2').
                replace('0', '1').replace('2', '0'), 2);
    }

    public static void main(String[] args) {
        System.out.println(findComplement(5));//2
        System.out.println(findComplement(1));//0
        System.out.println(findComplement(2));//1

        //法二
        System.out.println(findComplement2(5));//2
        System.out.println(findComplement2(1));//0
        System.out.println(findComplement2(2));//1
    }
}
